/*
 * MsjReceptorApp.cpp
 *
 *  Created on: 12/02/2010
 *      Author: San Martín, Matías I.
 */

#include "MsjReceptorApp.h"

#include <cstring>

#include "../../Framework/IO/log.h"

#include "../../Framework/Excepciones/InicializacionExcepcion.h"

using namespace framework::io;

MsjReceptorApp::MsjReceptorApp()
	: _semAccesoInfoPipe(NULL),
	  _semLeyendoDatos(NULL),
	  _datosRegitro(NULL),
	  _pidMsjReceptorMid(-1)
{

}

MsjReceptorApp::~MsjReceptorApp() {
}

void MsjReceptorApp::inicializar(Semaphore* semAccesoInfoPipe,
			Semaphore* semLeyendoDatos,
			t_sharedRegistro* datosRegitro,pid_t pidMsjReceptorMid)
{
	logger.set_pname("Planeta/MsjReceptorApp");
	logger << "inicializando MsjReceptorApp..." << logger.endl;

	if (!(*semAccesoInfoPipe && *semLeyendoDatos && *datosRegitro && pidMsjReceptorMid > 1))
	{
		throw InicializacionExcepcion("Error al inicializar el MsjReceptorApp"
				", parametros de inicializacion incorrectos.");
	}
	_semAccesoInfoPipe = semAccesoInfoPipe;
	_semLeyendoDatos = semLeyendoDatos;
	_datosRegitro = datosRegitro;
	_pidMsjReceptorMid = pidMsjReceptorMid;
	(*_datosRegitro)->nombrePipe[TAM_MAX__NOMBRE_PIPE + 1] = 0x00;

	logger << "MsjReceptorApp inicializado!" << logger.endl;
}

void MsjReceptorApp::registrarPipe(const std::string& nombrePipe,const IdPlaneta& idPlaneta)
{
	logger << LogType::LOG_DEBUG_0 <<"Se registra el pipe '" << nombrePipe
				<< "' asociado al destino '" << idPlaneta << "'." << logger.endl;

	//tomar semaforo de memoria compartida
	_semAccesoInfoPipe->wait();

	/* tomar semaforo de escribiendo info en tabla
	 * (lo libera el recpetor del middleware cuando termina de leer la info que
	 * se le paso) */
	_semLeyendoDatos->wait();

	// cargar nombrePipe e id de planeta en memoria compartida
	idPlaneta.saveToMensaje((*_datosRegitro)->idPlaneta);
	strncpy((*_datosRegitro)->nombrePipe,
			nombrePipe.c_str(),
			TAM_MAX__NOMBRE_PIPE);

	logger << LogType::LOG_DEBUG_0 <<"Evio señal al proceso '" << _pidMsjReceptorMid << "'." << logger.endl;

	/* enviar signal a proceso de receptor del middleware
	 * (para que cargue los datos en su tabla) */
	kill (_pidMsjReceptorMid,SIG_NOTIFICACION);

	//liberar semaforo de memoria compartida
	_semAccesoInfoPipe->signal();
}
